/* 
    开发环境配置性能优化

    HMR：hot module replacement
    热模块替换/ 模块热替换

    作用：一个模块发生变化，只会重新打包这一个模块，而不是重新打包所有模块

    极大提升构建速度

    样式文件：可以使用HMR功能：因为style-loader内部实现了

    js文件：默认不能使用HMR功能-->入口文件需要修改js代码
        注意：HMR功能对js的处理只能处理非入口文件
        
    html文件：默认不能使用HMR功能，同时html文件不能热更新了,
        解决：入口文件添加html文件
        html文件不需要做HMR处理


*/
const { resolve } = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');

module.exports = {
    entry: ['./src/js/index.js', './src/index.html'],
    output: {
        filename: 'js/built.js',
        path: resolve(__dirname, 'build')
    },
    module: {
        rules: [
            {
                test: /\.less$/,
                use: ['style-loader', 'css-loader', 'less-loader']
            },
            {
                test: /\.css$/,
                use: ['style-loader', 'css-loader']
            },
            {
                test: /\.html$/,
                loader: 'html-loader'
            },
            {
                test: /\.(jpg|png|gif)$/,
                loader: 'url-loader',
                options: {
                    limit: 8 * 1024,
                    esModule: false,
                    name: '[hash:10].[ext]',
                    outputPath: 'imgs'
                },
                // webpack5.0需要加这个才能正常使用url-loader
                type: 'javascript/auto',
            },
            {
                exclude: /\.(html|js|css|less|jpg|png|gif)$/,
                loader: 'file-loader',
                options: {
                    name: '[hash:10].[ext]',
                    esModule: false,
                    outputPath: 'fonts'
                },
                type: 'javascript/auto'
            }
        ]
    },
    plugins: [
        new HtmlWebpackPlugin({
            template: './src/index.html'
        })
    ],
    mode: 'development',
    devServer: {
        watchFiles: resolve(__dirname, 'build'),
        compress: true,
        port: 3000,
        open: true,
        // 开启HMR 模块热替换
        hot: true
    },
    devtool: 'eval-source-map'
};

/*
    source-map: 一种提供源代码到构建后代码的映射技术
        如果构建后代码出错了，通过映射关系可以追踪到源代码错误

    [inline-|hidden-|eval-][nosources-][cheap-[module-]]source-map

    source-map: 外部
        错误代码的准确信息 和 源代码的准确位置
    inline-source-map: 内联
        只生成一个内联source-map
        错误代码的准确信息 和 源代码的准确位置
    hidden-source-map: 外部
        错误代码的错误原因，但是没有源代码的错误位置
        只能提示到构建后代码的错误
    eval-source-map: 内联
        每一个文件都生成对应的source-map，都在eval
        错误代码的准确信息 和 源代码的准确位置
    nosources-source-map: 外部
        错误代码的准确信息，但是没有任何源代码信息
    cheap-source-map: 外部
        错误代码的准确信息 和 源代码错误位置
        只能精确到行
    cheap-module-source-map: 外部
        错误代码的准确信息 和 源代码错误位置
        只能精确到行
        module会将loader的source-map加入

    开发环境：速度快，调试更友好
        速度快（eval > inline > cheap > ...）
            eval-cheap-source-map
            eval-source-map
        调试更友好
            source-map
            cheap-moudle-source-map
            cheap-source-map

    结论 --> eval-source-map / eavl-cheap-moudle-source-map

    生产环境：源代码要不要隐藏？调试要不要更友好？
    内联会让代码体积变大，所以生产环境不用内联
        源代码隐藏：
            hidden-source-map 全部隐藏
            nosources-source-map 只隐藏源代码，会提示构建后代码错误信息
        调试更友好：
            source-map

    结论 --> source-map / cheap-module-source-map


    内联 和 外部 的区别：
    1. 外部生成了文件，内联没有
    2. 内联构建速度更快

*/